热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

上手|小时_eKuiperNewsletter202207|v1.6.0:Flow编排+更好用的SQL,轻松表达业务逻辑

篇首语:本文由编程笔记#小编为大家整理,主要介绍了eKuiperNewsletter2022-07|v1.6.0:Flow编排+更好用的SQL,轻松表达业务逻辑相关的知识,希望对你有

篇首语:本文由编程笔记#小编为大家整理,主要介绍了eKuiper Newsletter 2022-07|v1.6.0:Flow 编排 + 更好用的 SQL,轻松表达业务逻辑相关的知识,希望对你有一定的参考价值。



盛夏时节,eKuiper 本年度第二个大版本 v1.6.0 如约而至。面向 Flow 编排的图规则 API 的开发和内部试用打磨贯穿了整个夏季版本的开发过程,终于在 7 月完成。与此同时,我们也完成了多个 SQL 语法和函数的提升,期望 Flow 编排 和 SQL 双剑合璧能够帮助用户更容易地表达业务逻辑,覆盖更多样的使用场景,进一步减少定制开发的需求和成本。此外,我们也优化了外部系统连接的使用。例如 EdgeX 和 MQTT 连接中断时不再退出规则、SQL 和 TDengine Sink 支持批量写入等。

在之前的 Newsletter 中,我们已经陆续介绍过 v1.6.0 已开发完成的一些新功能,包括 protobuf 编解码的支持、离线缓存和重发等。本期 Newletter 将介绍其他新功能。完整的功能列表请查看​​1.6.0 Release​​.

面向 Flow 编排的图规则 API

在之前的版本中,eKuiper 的规则逻辑是通过 SQL + actions 的方式指定的。基于 SQL 语法的规则好处多多:

  • SQL 语法应用广泛,对于有技术背景的用户来说,比较容易上手。
  • SQL 语法简洁,在数据库领域已得到广泛验证,可以用很短的文本写出复杂的规则。
  • SQL 是声明式的语言,执行引擎需要解析生成执行计划。这样,执行引擎可自行对实际运行的执行计划进行优化而无需用户做任何更改。

SQL 在处理数据变换为核心的规则时显得得心应手。然而在部分场景中,SQL 语法并不是很合适。

  • 面向非技术人员的场景,SQL 难以上手。
  • 对于某些场景,SQL 语法难以表达或者过于复杂。例如,对某个事件根据模式匹配做分流处理,温湿度传感器的数据,若温度大于某个值,则做一种流程,温度小于某个值则执行另一个流程。总体来说,Flow 可覆盖更多的场景。
  • SQL 由于自身抽象程度高,难以实现 UI。

图规则 API 采用 JSON 格式,直接描述运行时执行的算子的有向无环图结构,可一对一映射成 UI 上的 Flow 编排。新的版本中,图规则 API 将作为 SQL 的补充提供。

值得注意的是,SQL 规则在新版本中仍然完整支持,用户可根据场景选用使用的 API。其中,SQL 更适合用户手写规则,而图 API 由于 JSON 结构冗长,较适合由 UI 生成。

使用方法

图规则 API 与 SQL 共用当前的规则 REST API endpoint,创建规则的时候通过指定 graph 属性来使用。graph 属性是有向无环图的 JSON 表述。它由 nodes 和 topo 组成,分别定义了图中的节点和它们的边。下面是一个由图形定义的最简单的规则。它定义了 3 个节点:demo,humidityFilter 和 mqttOut。这个图是线性的,即demo->humidityFilter->mqttOut。该规则将从 MQTT 的 demo 主题读取数据,通过湿度做过滤(humidityFilter)并将结果汇入 MQTT 的另一个主题(mqttOut)。


"id": "rule1",
"name": "Test Condition",
"graph":
"nodes":
"demo":
"type": "source",
"nodeType": "mqtt",
"props":
"datasource": "devices/+/messages"

,
"humidityFilter":
"type": "operator",
"nodeType": "filter",
"props":
"expr": "humidity > 30"

,
"mqttout":
"type": "sink",
"nodeType": "mqtt",
"props":
"server": "tcp://$mqtt_srv:1883",
"topic": "devices/result"


,
"topo":
"sources": ["demo"],
"edges":
"demo": ["humidityFilter"],
"humidityFilter": ["mqttout"]



图的 JSON 中的每个节点至少有 3 个字段:

  • type:节点的类型,可以是source、operator和sink。
  • nodeType:节点的实现类型,定义了节点的业务逻辑,包括内置类型和由插件定义的扩展类型。
  • props:节点的属性。它对每个 nodeType 都是不同的。

对于 source 和 sink,其 nodeType 与系统中内置的和通过插件扩展的类型完全对应。对于 operator 节点,我们提供了一系列对应 SQL 语法的内置节点,打到与 SQL 相同的表达能力。用户扩展的函数,可通过 funciton 节点或者 aggfunc 节点进行调用。完整的节点列表,请参考​​https://ekuiper.org/docs/zh/latest/rules/graph_rule.html#内置-operator-节点类型​​ 。

Flow Editor

在 eKuiper 核心版本中仅提供后台的图规则 API,厂商和用户可基于此实现拖拽的图形界面。我们也将在近期推出 Flow 编排 实现,方便用户使用。

参考实现的图形界面如下所示。图形界面中可在左侧画板中列出可用的内置和扩展节点,允许节点拖拽到画布上并连接成图、设置属性等。画板上的数据流图可方便地表示为 JSON,通过图规则 API 进行创建。

eKuiper

SQL 更新,编写规则更轻松

新版本中添加了几个 SQL 语法相关的更新:提供了 LAG 函数用于获取数据流中之前的值;提供了 BETWEEN 和 LIKE 语法;修改了时间窗口使其对齐到自然时间。

LAG 函数助力有状态分析

LAG 函数可查看数据流里之前的数据并与当前的数据进行计算。它对于计算一个变量的增长率,检测一个变量何时越过阈值,或一个条件何时开始或停止为真等等依赖缓存状态的计算都非常有用。之前版本中,有状态计算依赖于窗口或者用户自行扩展的插件,复杂度较高。LAG 函数可以大大降低有状态分析的门槛。

其使用语法为 lag(expr, [offset], [default value]),返回表达式前一个值在偏移 offset 处的结果,如果没有找到,则返回默认值,如果没有指定默认值则返回 nil。如果除 expression 外其余参数均未指定,偏移量默认为 1,默认值为 nil。在下例中,我们计算了温度值的变化率。

SELECT lag(temperature) as last, temperature, lag(temperature)/temperature as rate FROM demo

更多过滤方式

新版本中添加了 BETWEEN 和 LIKE 语法。其中,BETWEEN 用于数字类型数据的过滤,选出在一个范围内的数据。LIKE 用于字符串的过滤,选出满足某个模式的字符串。在下例中,我们选出了温度在 15 到 25 之间,同时 deviceName 以 device 开头的数据。

SELECT * FROM demo WHERE temperature BETWEEN 15 AND 25 AND deviceName LIKE "device%"

自然时间窗口

之前 eKuiper 时间窗口的开始时间是以实际窗口开始运行时间为准的。但是在实际场景中,时间的聚合通常都是基于自然时间。例如,1 个小时的时间窗口,期望的结果是每个自然小时的聚合。大部分的流式处理引擎也会将时间窗口对齐到自然时间中。因此,在本版本中,时间窗口的聚合也对齐到系统时区的自然时间。

更高效和稳定的连接

eKuiper 通过 source 和 sink 与外部系统进行连接。本版本中着力提高连接的稳定行和效率,主要改进了现有的 source 和 sink 的功能。

数据库批量写入

在 SQL sink 和 TDengine Sink 中,添加了属性 tableDataField,可写入内嵌的数据(单行或多行)。同时,二者在接收到数组数据(多行数据)时,将一次性批量写入所有的数据。

稳定 EdgeX 连接

改进了 EdgeX 的连接逻辑,当消息总线连接中断时不会立即退出规则也不会打印大量的 log 造成风暴。消息总线恢复后,可自动重连。总之,连接 EdgeX 的规则在创建后运行更加稳定,不会因为可恢复的错误而退出。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:​​https://www.emqx.com/zh/blog/ekuiper-newsletter-202207​​


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • TDEngine压测思路消息分发复用TDEngine底层的逻辑,包括连接建立,消息读取,消息发送,消息执行,定 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了包的基础知识,包是一种模块,本质上是一个文件夹,与普通文件夹的区别在于包含一个init文件。包的作用是从文件夹级别组织代码,提高代码的维护性。当代码抽取到模块中后,如果模块较多,结构仍然混乱,可以使用包来组织代码。创建包的方法是右键新建Python包,使用方式与模块一样,使用import来导入包。init文件的使用是将文件夹变成一个模块的方法,通过执行init文件来导入包。一个包中通常包含多个模块。 ... [详细]
author-avatar
手机用户2602922195
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有